package es.ucm.fdi.pe.practica3.genetico3.mutacion;

import es.ucm.fdi.pe.practica3.genetico3.Arbol;
import es.ucm.fdi.pe.practica3.genetico3.Individuo;
import es.ucm.fdi.pe.practica3.genetico3.Arbol.Tipo;

public class MutacionFuncional extends Mutacion{
	
	public void mutar(Individuo i){
		//Nodos_no_terminales = Nodos_no_terminales-nodos_terminales
		int nodosNoTerminales = i.getArbol().getNum_nodos()-i.getArbol().getNum_nodos_hoja();
		int nodoAMutar=alea_entero(1,nodosNoTerminales);
		//System.out.println("Nodo A mutar:"+nodoAMutar);
		mutar(nodoAMutar-1,i.getArbol());
		
	}
	
	private int mutar(int n, Arbol a){
			
			if(!a.soyTerminal()){
				//System.out.println("no soy terminal");
				if(n==0){
					
					Tipo t;
					//System.out.println("Voy a mutar"+a.getTipo());
					switch(a.getTipo()){
						case SIC:
							
							t=Tipo.SIC;
							while(t==Tipo.SIC){
								t=operadorAleatorio();
							}
							//System.out.println("Por "+t);
							a.setTipo(t);
							break;
						case PROGN2:
							t=Tipo.PROGN2;
							while(t==Tipo.PROGN2){
								t=operadorAleatorio();
							}
							//System.out.println("Por "+t);
							a.setTipo(t);
							break;
						}
				}
				
				else{ 
					n--;
					//System.out.println("Decremento n:"+n);
					n=mutar(n,a.getHI());
						if(a.tieneHijoCentral())
							n=mutar(n,a.getHC());
					n=mutar(n,a.getHD());
				}
			}
			else{
				//Nodo terminal
				}
			return n;
		}

	public static void main(String args[]){
		Individuo i1 = new Individuo(2,3);
		System.out.println(i1.getArbol().recorridoEnProfundidad("   "));
			new MutacionFuncional().mutar(i1);
	
		System.out.println(i1.getArbol().recorridoEnProfundidad("   "));
	}
}
